"""
我们一上来就考虑使用岛屿问题的感染函数是正确的，但是存在一种特殊情况
    岛屿问题，对于边界处的陆地是有效的，
    但是在本问题中，要求必须被水包围，所以，边界处的陆地是无效的

所以我们可以考虑先把边界的陆地以及与边界相连的陆地，使用感染函数将所有的陆地替换为"#"
接下来，两次遍历矩阵，
    第一次就感染边界及相连陆地
    第二次就将#替换为O,将O替换为X
"""
class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        def infect(i, j):
            if i < 0 or i >= m or j < 0 or j >= n or board[i][j] != 'O':
                return
            
            board[i][j] = '#'
            infect(i - 1, j)
            infect(i + 1, j)
            infect(i, j - 1)
            infect(i, j + 1)
        
        m, n = len(board), len(board[0])

        for i in range(m):
            for j in range(n):
                edge = (i == 0) or (i == m - 1) or (j == 0) or (j == n - 1) 
                if edge and board[i][j] == "O":
                    infect(i, j)
        
        for i in range(m):
            for j in range(n):
                if board[i][j] == "#":
                    board[i][j] = "O"
                elif board[i][j] == "O":
                    board[i][j] = "X"
                elif board[i][j] == "X":
                    continue
        